//
//  ComposeViewController.swift
//  SinaMicroBlog
//
//  Created by wxy on 15/9/12.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit
import SVProgressHUD

// 撰写微博控制器
class ComposeViewController: UIViewController, UITextViewDelegate {
    
    // MARK: - 表情键盘
    // 表情键盘控制器 业务逻辑多 所以自定义控制器
    // 注意： 闭包中调用 self. 函数 同样会做 copy 需要注意循环引用
    private lazy var keyboardVC: EmoticonViewController = EmoticonViewController { [weak self](emoticon) -> () in
        // print(emoticon.chs)
        self?.textView.insertEmoticon(emoticon)
    }
    
    // 切换表情键盘
    @objc private func switchEmoticonKeyboard() {
        // inputView == nil 表示使用的系统键盘
        // printLog(textView.inputView)
        
        // 注销焦点
        textView.resignFirstResponder()
        
        // 切换键盘
        textView.inputView = (textView.inputView == nil) ? keyboardVC.view : nil
        
        // 激活焦点
        textView.becomeFirstResponder()
    }

    // MARK: - 控件动画约束
    // 工具栏底部约束
    private var toolbarBottomConstraint: NSLayoutConstraint?
    // 文本视图底部约束
    private var textViewBottomConstraint: NSLayoutConstraint?
    // 照片选择视图的高度约束
    private var pictureViewHeightConstraint: NSLayoutConstraint?
    
    
    // MARK: - 监听方法
    @objc private func close() {
        dismissViewControllerAnimated(true, completion: nil)
        
        // 关闭键盘
        textView.resignFirstResponder()
    }
    
    // 选择照片
    @objc private func selectPicture() {
        
        // 1. 删除文本视图和 toolbar 之间的约束
        view.removeConstraint(textViewBottomConstraint!)
        
        // 2. 设置文本视图和照片视图之间的约束
        textViewBottomConstraint = NSLayoutConstraint(item: textView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: pictureSelectorVC.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
        view.addConstraint(textViewBottomConstraint!)
        
        // 3. 设置高度约束
        pictureViewHeightConstraint?.constant = UIScreen.mainScreen().bounds.height * 0.6
        
        // 4. 关闭键盘
        textView.resignFirstResponder()
        
        // 5. 动画更新约束(尾随闭包)
        UIView.animateWithDuration(0.25) {
            self.view.layoutIfNeeded()
        }
        
    }
    
    @objc private func sendStatuses() {
        
        // 1. 获取带表情符号的文本字符串
        let text = textView.emoticonText
        
        // 2. 发送微博
        NetworkTools.sharedNetworkTools.sendStatus(text, image: pictureSelectorVC.pictures.last).subscribeNext({ (result) -> Void in
            
            // 刚刚发送成功的微博数据字典
            printLog(result)
            }, error: { (error) -> Void in
                printLog(error, logError: true)
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
            }) { () -> Void in
                
                self.close()
        }
    }
    
    // MARK: - UITextViewDelegate
    func textViewDidChange(textView: UITextView) {
        
        placeholderLabel.hidden = textView.hasText()
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
    }
    
    // MARK: - 视图声明周期函数
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 注册键盘通知
        // Observer 监听器接收通知者 name 通知名称 object 发布通知者
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardChanged:", name: UIKeyboardWillChangeFrameNotification, object: nil)
    }
    
    deinit {
        
        // 注销通知
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    // 键盘变化监听方法
    @objc private func keyboardChanged(notify: NSNotification) {
        
        // printLog(notify)
        
        // 获取动画曲线数值 - 7 没有官方文档
        // 两个特点
        // 1. 在连续的动画过程中，前一个动画如果没有执行完毕，直接过渡到最后一个动画
        // 2. 使用7后 动画时长一律编程 0.5 秒 duration就不再起作用
        let curve = notify.userInfo![UIKeyboardAnimationCurveUserInfoKey]!.integerValue
        
        // 获取最终的frame  - OC 中将结构体保存在字典 存成NSValue
        let rect = notify.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue
        
        // 将工具栏和键盘同步
        let duration = notify.userInfo![UIKeyboardAnimationDurationUserInfoKey]!.doubleValue
        
        // 刀哥的框架 控件参照底部约束 向上移动 需要取反
        // 滚动时 保证工具栏移动到底部
        toolbarBottomConstraint?.constant = -UIScreen.mainScreen().bounds.height + rect.origin.y
        
        // UIView 块动画 本质上是对'核心动画'的封装
        // 1. 通过 keyPath 来制定可动画属性的数值
        // 2. 将动画添加到'图层'
        UIView.animateWithDuration(duration) {
            
            // 设置动画曲线
            UIView.setAnimationCurve(UIViewAnimationCurve.init(rawValue: curve)!)
            
            self.view.layoutIfNeeded()
        }
        
        // 调试动画
        // let anim = toolbar.layer.animationForKey("position")
        // printLog("动画时长 \(anim?.duration)")
    }
    
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        // pictures 有值 表示已选图片 发送按钮可用
        navigationItem.rightBarButtonItem?.enabled = pictureSelectorVC.pictures.count != 0 ? true :false
        
        // 如果用户已经选择了照片 就不再激活键盘 高度约束 > 0 说明已经选择了照片
        if pictureViewHeightConstraint?.constant == 0 {
            
            // 激活键盘 保证页面跳转过来就弹出键盘 用户体验
            textView.becomeFirstResponder()
        }
        
    }

    // MARK: - 创建界面
    // 专门创建界面的函数
    
    override func loadView() {
        
        // 必须要实例化view 因为这个方法 还没有创建view
        view = UIView()
        
        // 将自动调整 scrollView 的缩进取消
        automaticallyAdjustsScrollViewInsets = false
        
        view.backgroundColor = UIColor.whiteColor()
        
        prepareNav()
        prepareToolbar()
        prepareTextView()
        preparePicture()
        
    }
    
    // 准备照片选择视图
    private func preparePicture() {
        
        // storyboard 中有一个 containerView，纯代码中没有这个控件
        // 本质上就是一个 UIView
        // 1> addSubView(vc.view)
        // 2> addChildViewController(vc)

        // TODO: - 复习响应者链条
        // 0. 添加子控制器 - 提示：实际开发中发现响应者链条无法正常传递 通常就是忘记了添加子控制器
        addChildViewController(pictureSelectorVC)
        
        // 1. 添加视图
        view.insertSubview(pictureSelectorVC.view, belowSubview: toolbar)
        
        // 2。 自动布局
        let size = UIScreen.mainScreen().bounds.size
        let w = size.width
        let h: CGFloat = 0
        
       let constraint = pictureSelectorVC.view.ff_AlignInner(type: ff_AlignType.BottomLeft, referView: view, size: CGSize(width: w, height: h))
        // 记录照片视图的高度约束
        pictureViewHeightConstraint = pictureSelectorVC.view.ff_Constraint(constraint, attribute: NSLayoutAttribute.Height)
        
    }
    
    // 设置文本视图
    private func prepareTextView() {
        
        view.addSubview(textView)
        
        // 测试占位视图的位置
        // textView.text = "分享新鲜事..."
        
        // 自动布局
        textView.translatesAutoresizingMaskIntoConstraints = false
        
        // topLayoutGuide 自动判断顶部的控件（状态栏、navBar）
        let viewDict: [String: AnyObject] = ["top": topLayoutGuide, "tb": toolbar, "tv": textView]
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tv]-0-|", options: [], metrics: nil, views: viewDict))
        // topLayoutGuide 保证文本视图不被遮住
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[top]-0-[tv]", options: [], metrics: nil, views: viewDict))
        
        // 定义 textView 和 toolbar 之间的约束
        textViewBottomConstraint = NSLayoutConstraint(item: textView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: toolbar, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
        view.addConstraint(textViewBottomConstraint!)
        
        // 设置占位标签 - 添加到textView 保证能够同时滚动
        textView.addSubview(placeholderLabel)
        placeholderLabel.frame = CGRect(origin: CGPoint(x: 5, y: 8), size: placeholderLabel.bounds.size)
    }
    
    // 设置工具栏
    private func prepareToolbar() {
        
        view.addSubview(toolbar)
        
        // 解决最后按钮 @1x 的问题
        toolbar.backgroundColor = UIColor(white: 0.8, alpha: 1.0)
        
        // 设置自动布局
        let w = UIScreen.mainScreen().bounds.width
        
        let constraint = toolbar.ff_AlignInner(type: ff_AlignType.BottomCenter, referView: view, size: CGSize(width: w, height: 44))
        // 记录底部约束
        toolbarBottomConstraint = toolbar.ff_Constraint(constraint, attribute: NSLayoutAttribute.Bottom)
        // 确认获得约束
        // printLog(toolbarBottomConstraint)
        
        // 字典数组存放按钮图片
        let itemSettings = [["imageName": "compose_toolbar_picture", "action": "selectPicture"],
            ["imageName": "compose_mentionbutton_background"],
            ["imageName": "compose_trendbutton_background"],
            ["imageName": "compose_emoticonbutton_background", "action": "switchEmoticonKeyboard"],
            ["imageName": "compose_addbutton_background"]]
        
        // 按钮数组 添加按钮
        var items = [UIBarButtonItem]()
        
        for dict in itemSettings {
            
            items.append(UIBarButtonItem(imageName: dict["imageName"]!, target: self, actionName: dict["action"]))
            
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
        }
        
        // 删除最后一个FlexibleSpace
        items.removeLast()
        
        toolbar.items = items
    }
    
    // 设置导航控制器
    private func prepareNav() {
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "发送", style: UIBarButtonItemStyle.Plain, target: self, action: "sendStatuses")
        
        // 默认禁用
        navigationItem.rightBarButtonItem?.enabled = false
        
        // 标题视图
        let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 32))
        let titleLabel = UILabel(title: "发微博", color: UIColor.darkGrayColor(), fontSize: 15)
        let nameLabel = UILabel(title: UserAccountViewModel.sharedUserAccount.userAccount?.name, color: UIColor.lightGrayColor(), fontSize: 14)
        
        titleView.addSubview(titleLabel)
        titleView.addSubview(nameLabel)
        
        titleLabel.ff_AlignInner(type: ff_AlignType.TopCenter, referView: titleView, size: nil)
        nameLabel.ff_AlignInner(type: ff_AlignType.BottomCenter, referView: titleView, size: nil, offset: CGPoint(x: 0, y: 4))
        
        navigationItem.titleView = titleView
    }
    
    // MARK: - 懒加载控件
    private lazy var textView: UITextView = {
        
        let textView = UITextView()
        
        // 设置代理
        textView.delegate = self
        
        textView.font = UIFont.systemFontOfSize(18)
        textView.textColor = UIColor.darkGrayColor()
        
        // 允许垂直拖拽
        textView.alwaysBounceVertical = true
        // 拖拽关闭键盘
        textView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
        
        return textView
    }()
    
    // 占位标签
    private lazy var placeholderLabel: UILabel = UILabel(title: "分享新鲜事...", color: UIColor.lightGrayColor(), fontSize: 18)
    
    // 工具栏
    private lazy var toolbar = UIToolbar()
    
    // 照片选择控制器
    private lazy var pictureSelectorVC = PictureSelectorViewController()
}
